[Amazon Connect] チャットクライアントを設置してみました。(amazon-connect-chat-interface.jsを利用)
1 はじめに
CX事業本部の平内(SIN)です。
Amazon Connect(以下、Connect)では、先月から、音声での対応に加えて、チャットでの利用も可能になっています。
今回は、Amazonで提供されている、下記のチャットクライアントの設置を試してみました。
上記のリポジトリでは、CFnも提供されており、設置するだけなら超簡単なのですが、ちょっと仕組みを確認したかったのと、少しでも理解が深まるようにと、CFnを使用せずに設置してみました。
最初に、利用している様子です。
2 インスタンス・コンタクトフロー
チャット設置には、対象となるConnectのインスタンス及び、接続先のコンタクトフローを最初に用意することが必要です。
ここで、コンタクトフローは、先日、作成した下記のものを使用しました。
[Amazon Connect] チャットに対応するコンタクトフローを作成してみました。
チャットクライアントから接続されると、20秒間待機し、何らかのキー入力があった時点でエージェントに繋ぐものとなっています。
問い合わせフローの開くと、左にフローのarnを表示させることができます。 形式は、下記のようになっているので、インスタンスID及び、フローIDをここでコピーしておきます。
arn:aws:connect:{リージョン}:{アカウント}:instance/{インスタンスID}/contact-flow/{フローID}
3 Lambda
問い合わせフローを開始して、新しいチャットを開始するには、startChatContactAPIを使用します。
var params = { InstanceId: instanceId, ContactFlowId: contactFlowId, Attributes: { customerName: customerName }, ParticipantDetails: { DisplayName: displayName } }; const result = await connect.startChatContact(params)
このAPIは、インスタンスID、フローID及び、顧客の名前等を引数にとり、接続に必要なトークン等を返します。
下記は、レスポンスの一例です。
{ ContactId: "4012d973-xxxx-xxxx-xxxx-970f45fccc5a", ParticipantId: "d3b7da64-xxxx-xxxx-xxxx-68e6673476f2", ParticipantToken: "token" }
今回試しているstartChatContactAPIでは、このstartChatContactをLambdaで実装し、API Gateway経由で、クライアントのJavaScriptから呼び出しています。
Githubのコードを参考に、下記のLambdaを設置しました。
Lambdaの戻り値では、ブラウザ側のJavaScriptで利用可能なように、CORS用のヘッダが追加されていますが、ここでは、いったん対象ドメインを*で指定しています。
AmazonConnectChatTest
const AWS = require('aws-sdk'); const connect = new AWS.Connect(); const instanceId = '7d0290d7-xxxx-xxxx-xxxx-ef397afa108d'; const contactFlowId = '14954dcd-xxxx-xxxx-xxxx-17e5b7f2a3f6'; const customerName = 'customer'; const displayName = 'customer'; const allowOrigin = '*'; exports.handler = async (event, _context) => { console.log(`REQUEST ${JSON.stringify(event)}`); var params = { InstanceId: instanceId, ContactFlowId: contactFlowId, Attributes: { customerName: customerName }, ParticipantDetails: { DisplayName: displayName } }; try { const result = await connect.startChatContact(params).promise(); return createResponse(200, result); } catch(err) { return createResponse(500, err); } }; function createResponse(statusCode, result) { const response = { statusCode: statusCode, headers: { "Access-Control-Allow-Origin": allowOrigin, 'Content-Type': 'application/json', 'Access-Control-Allow-Credentials' : true, 'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token' }, body: JSON.stringify({ data: { startChatResult: result } }) }; console.log(`RESPONSE statucCode: ${statusCode} result: ${JSON.stringify(response)}`); return response; }
Lambdaには、ConnectのAPIをコールするため、通常のCloudWatch Logへのアクセス以外に、下記のパーミッションが必要です。
{ "Action": [ "connect:StartChatContact" ], "Resource": [ "arn:aws:connect:{リージョン}:{アカウント}:instance/{インスタンスID}", "arn:aws:connect:{リージョン}:{アカウント}:instance/{インスタンスID}/*" ], "Effect": "Allow" }
4 API Gateway
API Gatewayでは、POSTを受け取るリソースを作成し、プロキシ統合で上記のLambdaへ繋いでいます。
5 amazon-connect-chat-interface.js
設置したhtmlは、以下のとおりです。こちらも、Guithubのコードをほとんど、そのまま利用させて頂いています。
amazon-connect-chat-interface.jsを使用していますので、読み込めるところに配置の必要があります。
<!DOCTYPE html> <html> <head> <title></title> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script> <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script> <script src="amazon-connect-chat-interface.js"></script> </head> <body> <form name="contactDetails" id="contactDetails"> <input type="submit" class="submit" id="startChat" value="Start Chat"></input> </form> <div class="section-chat" id="section-chat" style="display: none; width: 50%;"> <div id="root"></div> </div> <script> const apiGatewayEndpoint = 'https://ggi242o24i.execute-api.ap-northeast-1.amazonaws.com/dev'; const region = 'ap-northeast-1'; const customerName = 'customer'; $(document).ready((a) => { connect.ChatInterface.init({ containerId: 'root' }); }); $(function () { $('#contactDetails').submit(function (e) { e.preventDefault(); document.getElementById("contactDetails").reset(); connect.ChatInterface.initiateChat({ name: customerName, region: region, apiGatewayEndpoint: apiGatewayEndpoint, contactAttributes: JSON.stringify({ "customerName": customerName }), },successHandler, failureHandler); }); }); function successHandler(chatSession) { console.log("success!"); $('#section-chat').fadeIn(400); chatSession.onChatDisconnected(function(data) { $('#section-chat').hide('slide'); }); } function failureHandler(error) { console.log("There was an error: "); console.log(error); } </script> </body>
6 最後に
Connectの新しいチャンネルとして追加されたチャットですが、amazon-connect-chat-interface.jsを利用することで、Webサイトに容易に設置が可能です。
なお、amazon-connect-chat-interface.jsは、UIを自前で準備する使い方もできるようですので、次回、そちらも試してみたいと思います。